home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / bin / flythrough / main.c < prev    next >
C/C++ Source or Header  |  1993-10-29  |  5KB  |  241 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include "forms.h"
  4.  
  5. #define LOOP     0
  6. #define QUARTER    1
  7. #define DIRECT    2
  8. #define EQUI    3    
  9.  
  10. #define EUC 0
  11. #define HYP 1
  12.  
  13. float dodecscale;
  14. char path[24];
  15. FILE *f;
  16. int go;
  17. int speed;
  18. int whichpath;
  19. int helpwinid = 0;
  20. int mainwinid = 0;
  21.  
  22. #include "panel.c"
  23.  
  24. char flyhelpstr[] =
  25. #include "flyhelp.h"
  26. ;
  27.  
  28. static char *getline(char *s);
  29.  
  30. init()
  31. {
  32.  
  33.   foreground();
  34.   create_the_forms();
  35.  
  36.   printf("(progn \n");
  37.   printf("(geometry notknot.vect { INST transforms : tile geom {");
  38.   printf("    INST geom < dodec.vect transform : scale}})\n");
  39.   printf(" (space hyperbolic) (bbox-draw allgeoms off)\n");
  40.   printf(" (backcolor c0 0 0 0)\n");
  41.   printf(" (merge camera c0 {fov 100})\n");
  42.   printf(" (merge-ap notknot.vect {linewidth 2})\n");
  43.   printf(" (load-path (. $GEOMDATA $GEOMDATA/geom $GEOMDATA/groups))\n");
  44.   printf(" (echo 'caughtup\n')\n");
  45.   printf(")\n");
  46.   fflush(stdout);
  47.  
  48.   go = 1;
  49.   fl_set_button(Go, 1);
  50.   dodecscale = .99;          /* scale dodecahedron */
  51.   fl_set_slider_bounds(DodecScale, 0.01, 1.0);
  52.   fl_set_slider_value(DodecScale, dodecscale); 
  53.   ScaleProc(DodecScale, dodecscale);
  54.   speed = 2;            /* speed */
  55.   fl_set_button(Speed2, 1); 
  56.   SpeedProc(Speed2,2);
  57.   fl_set_button(Loop, 1);     /* path */
  58.   PathProc(Loop, LOOP);
  59.   fl_set_button(Level2, 1);     /* tile depth */
  60.   TilingProc(Level2, 2);
  61.  
  62.   fl_set_form_position(MainForm,8,8);
  63.   mainwinid = fl_show_form(MainForm, FL_PLACE_POSITION, TRUE, "Flythrough");
  64. }
  65.  
  66. void TilingProc(FL_OBJECT *obj, long val) 
  67. {
  68.   printf("(read geometry {define tile { < br4.%1d.tlist}})\n",val);
  69.   fflush(stdout);
  70. }
  71.  
  72. void SpeedProc(FL_OBJECT *obj, long val) 
  73. {
  74.   speed = val;
  75.   PathProc(NULL, whichpath);
  76. }
  77.  
  78. void GoProc(FL_OBJECT *obj, long val) 
  79. {
  80.   go = val;
  81. }
  82.  
  83. void ScaleProc(FL_OBJECT *obj, long val)
  84. {
  85.   float scale = fl_get_slider_value(obj);
  86.   printf("(read transform {define scale {1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 %f}})\n", 1.0/scale);
  87.   fflush(stdout);
  88. }
  89.  
  90.  
  91. void PathProc(FL_OBJECT *obj, long val)
  92. {
  93.   char *first;
  94.   char *name;
  95.  
  96.   whichpath = val;
  97.  
  98.   switch(whichpath) {
  99.   case LOOP: 
  100.     first = "loop"; break; 
  101.   case QUARTER:
  102.     first = "quart"; break;
  103.   case DIRECT:
  104.     first = "dir"; break;
  105.   case EQUI:
  106.     first = "equi"; break;
  107.   }
  108.   
  109.   fclose(f);  
  110.   /* GEOMDATA environment variable is supposed to be set by geomview. 
  111.      We'll assume it's correct and just whine if we can't find anything.
  112.      Note the setenv hint for the user.
  113.    */
  114.   if ((name = getenv("GEOMDATA")) == NULL) 
  115.     sprintf(path,"%s.%1d.gv", first, speed);
  116.   else 
  117.     sprintf(path,"%s/groups/%s.%1d.gv", name, first, speed);
  118.   f = fopen(path, "r");
  119.   if (!f) {
  120.     fprintf(stderr, "Can't find path file %s.\nTry setting environment variable GEOMDATA.\n", path);
  121.     exit(0);
  122.   } else 
  123.     rewind(f);
  124.  
  125.   /* Just in case someone recentered the camera and the fov got reset to 40 */
  126.   printf(" (merge camera c0 {fov 100})\n");
  127.   fflush(stdout);
  128. }
  129.  
  130.  
  131.  
  132. void InfoProc(FL_OBJECT *obj, long val) 
  133. {
  134.   FILE *hf = fopen("flyhelp", "r");
  135.   int winid;
  136.   char gvstr[256];
  137.  
  138.   if (hf == NULL) {
  139.     char *line, *delims = "\n";
  140.     line = getline(flyhelpstr);
  141.     while (line) {
  142.       fl_add_browser_line( HelpBrowser, line );
  143.       line = getline(NULL);
  144.     }
  145.     fl_set_browser_topline( HelpBrowser, 1 );
  146.   } else {
  147.     fl_load_browser(HelpBrowser, "flyhelp");
  148.   }
  149.   fclose(hf);
  150.   fl_set_button(Info, 1);
  151.   fl_set_button(EucDiag, 1);
  152.   fl_set_button(HypDiag, 0);
  153.   fl_set_form_position(HelpForm,8, 393);
  154.   helpwinid = fl_show_form(HelpForm, FL_PLACE_POSITION, TRUE, "Flythrough Help");
  155.   if (helpwinid) winset(helpwinid);
  156.   winpop();
  157.   winset(mainwinid);
  158.   /* OK, so this is probably not the most elegant way to do this.
  159.      It does work though...
  160.    */
  161.   sprintf(gvstr,"rm -f /tmp/flythrough; /etc/mknod /tmp/flythrough p; geomview -c '(progn (ui-panel main 0) (ui-panel tools 0) (window default { size 200 200 position 559 758 535 734 }))' -c /tmp/flythrough flythrough_diagram.gv &");
  162.   system(gvstr);
  163. }
  164.  
  165. void DiagProc(FL_OBJECT *obj, long val) 
  166. {
  167.   char str[128];
  168.   sprintf(str, "echo '(space %s)' > /tmp/flythrough", 
  169.       (val == EUC) ? "euclidean" : "hyperbolic");
  170.   system(str);
  171. }
  172.  
  173. void DoneProc(FL_OBJECT *obj, long val) 
  174. {
  175.   if (helpwinid) fl_hide_form(HelpForm);
  176.   helpwinid = 0;
  177.   system("echo '(exit)\n' > /tmp/flythrough");
  178.   fl_set_button(Info, 0);
  179. }
  180.  
  181. void QuitProc(FL_OBJECT *obj, long val) 
  182. {
  183.   DoneProc(NULL, NULL);
  184.   exit(0);
  185. }
  186.  
  187. main(int argc, char *argv[])
  188. {
  189.   char line[80];
  190.   char *more, *caughtup;
  191.   int i, turbo;
  192.  
  193.   init();
  194.   while (--argc > 0) {
  195.     if (argv[1][0] == '-' && argv[1][1] == 't')
  196.       turbo = 1;
  197.     else if (argv[1][0] == '-' && argv[1][1] == 'h')
  198.       InfoProc(NULL, NULL);
  199.     argv++;
  200.   }
  201.   while (1) {
  202.     fl_check_forms();
  203.     if (go)
  204.       if (turbo || (caughtup = fgets(line, 10, stdin))) {
  205.       /* a command is exactly 18 lines long due to the vagaries of
  206.      Mathematica... */
  207.       for (i = 0; i < 18; i++) {
  208.     if (! (more = fgets(line, 80, f))) {
  209.       rewind(f);
  210.       break;
  211.     } else {
  212.       fputs(line, stdout);
  213.     }
  214.       }
  215.       if (!turbo) printf("(echo 'caughtup\n')\n");
  216.       fflush(stdout);
  217.     }
  218.   }
  219. }
  220.  
  221. /* Stolen from Mark Phillips' Hinge module */
  222. static char *getline(char *s)
  223. {
  224.   static char *p;
  225.   char *first;
  226.  
  227.   if (s != NULL) {
  228.     p = s;
  229.   } else {
  230.     *p = '\n';
  231.   }
  232.   ++p;
  233.   first = p;
  234.   while (*p != '\n' && *p != '\0') ++p;
  235.   if (*p == '\n') {
  236.     *p = '\0';
  237.     return first;
  238.   }
  239.   return NULL;
  240. }
  241.